package gen;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import util.TestUtil;

public class MakeUploadSample {
	private static final Logger logger = LoggerFactory.getLogger(MakeUploadSample.class);

	private Connection conn = null;
	private String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	private String id = "hr";
	private String pwd = "hr";
			
	private void connect() throws ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		conn = DriverManager.getConnection(url, id, pwd);
		conn.setAutoCommit(false);
	}
	
	private void unconnect() throws SQLException {
		if (conn != null) { conn.close(); }
	}

	private static final String INSERT_UPLOAD_TEMP = "INSERT INTO UPLOAD_TEMP_1 (UPLOAD_ID, EXCEL_ROW_ID, COL_1, COL_2, COL_3, COL_4, COL_5, COL_6, COL_7, COL_8, COL_9, COL_10) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	private static final String SELECT_FK_1 = "SELECT EMPLOYEE_ID FROM EMPLOYEES";
	private static final String SELECT_FK_2 = "SELECT COUNTRY_ID FROM COUNTRIES";
	private List<String> fk1 = new ArrayList<String>();
	private List<String> fk2 = new ArrayList<String>();
	private List<String> string = new ArrayList<String>() {{
		add("워크아웃에 들어간 팬택은 과연 인도 업체에 팔리게 될까.");
		add("팬택의 자생력에 대한 의구심이 여전히 가시지 않은 가운데 인도 스마트폰 제조사 마이크로맥스가 팬택을 인수할 가능성이 제기돼, 향후 추이에 관심이 증폭되고 있다.");
		add("14일 팬택과 채권단 등에 따르면, 최근 팬택에 대해 다수의 해외 업체가 지분 투자 의향을 밝힌 것으로 전해졌다. 특히 인도 2위 스마트폰 제조사인 마이크로맥스가 적극적인 관심을 나타내고 있는 것으로 확인됐다. 마이크로맥스의 팬택 인수설까지 나오고 있는 상황이다.");
		add("이와 관련 팬택 관계자는 \"인도 마이크로맥스와 지분 투자를 논의한 것은 사실이지만 별다르게 확정된 사항은 없다\"며 매각설로 확대 해석되는 것은 경계했다.");
		add("채권단 한 관계자도 \"마이크로맥스가 작년 말부터 팬택에 관심을 갖고 있었고 팬택 측과 이야기해온 것으로 알지만 채권단과는 아직 논의한 적이 없다\"고 밝혔다."); 
		add("마이크로맥스는 인도 시장에서 저가형 제품으로 선풍적인 인기를 끌고 있는 업체다.");
		add("월 230만대 이상의 기기를 판매하며 인도 내 2위, 세계 시장에서는 10위권으로 평가 받고 있다. 2G 휴대전화와 3G 안드로이드 스마트폰을 비롯해 태블릿, LED TV 등을 제작하고 있다.");
		add("마이크로맥스는 팬택의 고가형 제품 제조 기술에 주목하는 것으로 전해지고 있다."); 
		add("저가형 위주의 내수 시장을 넘어 고가형 제품과 브랜드 확보를 통한 세계 시장 진출을 노리고 있는 것으로 풀이된다. 팬택은 국내는 물론 미국 등 해외에서도 오랜 기간 판매를 진행해왔다.");
		add("팬택은 최근 자금난으로 워크아웃(기업회생작업)에 돌입했다. 지난 워크아웃 당시에는 삼성전자와 퀄컴 등 관계사들로부터 지분 투자를 유치한 바 있다.");
	}};
	
	private void init() {
		Statement stmt = null;
		ResultSet rs = null;

		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(SELECT_FK_1);
			while (rs.next()) { fk1.add(rs.getString("EMPLOYEE_ID")); }
			
			rs.close();
			
			rs = stmt.executeQuery(SELECT_FK_2);
			while (rs.next()) { fk2.add(rs.getString("COUNTRY_ID")); }
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) { rs.close(); }
				if (stmt != null) { stmt.close(); }
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

	private static SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	private int getRandomInt(int limit) { return (int)(Math.floor(Math.random() * (limit + 1))); }
	
	private String getRandomFk1() { return fk1.get(getRandomInt(fk1.size() - 1)); }
	private String getRandomFk2() { return fk2.get(getRandomInt(fk2.size() - 1)); }
	private String getRandomString() { return string.get(getRandomInt(string.size() - 1)); }
	private double getRandomDouble() {
		double cp = Math.pow(10, getRandomInt(10));
		int abs = getRandomInt(1);
		if (abs == 0) { abs = -1; }
		return Math.random() * cp * abs;
	}
	
	private static int[] DATE_FIELD = {Calendar.MONTH, Calendar.DATE, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND};
	
	public Date getRandomTime() {
		Calendar c = Calendar.getInstance();
		c.setTime(new Date());
		
		int field = DATE_FIELD[getRandomInt(DATE_FIELD.length - 1)];
		int abs = getRandomInt(1);
		if (abs == 0) { abs = -1; }
		int inc = getRandomInt(365) * abs;
		c.add(field, inc);
		
		return c.getTime();
	}
	
	@Test
	public void insert() throws ClassNotFoundException, SQLException {
		connect();

		init();
		
		PreparedStatement stmt = null;
		try {
			stmt = conn.prepareStatement(INSERT_UPLOAD_TEMP);
			
			for (long i = 1; i <= 5000000; i++) {
				logger.debug(Long.toString(i));
				stmt.setString(1, "1");
				stmt.setLong(2, i);
				stmt.setString(3, getRandomFk1());
				stmt.setString(4, getRandomFk2());
				stmt.setString(5, getRandomString());
				stmt.setString(6, getRandomFk1());
				stmt.setString(7, getRandomFk2());
				stmt.setString(8, getRandomString());
				stmt.setString(9, String.format("%f", getRandomDouble()));
				stmt.setString(10, String.format("%d", getRandomInt(100000000)));
				stmt.setString(11, dateFormat.format(getRandomTime()));
				stmt.setString(12, timeFormat.format(getRandomTime()));
				stmt.addBatch();
				
				if (i % 10000 == 0) { stmt.executeBatch(); }
			}
			
			stmt.executeBatch();
			conn.commit();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (stmt != null) { stmt.close(); }
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		unconnect();
	}

	@Test
	public void testRandom() {
	}
}
